home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
CUGUK
/
PROG_TOO
/
C027B.ZIP
/
MAKE
/
MACRO.C
< prev
next >
Wrap
Text File
|
1990-03-30
|
3KB
|
164 lines
/***************************************************************\
* *
* PDMAKE, Atari ST version *
* *
* Adapted from mod.sources Vol 7 Issue 71, 1986-12-03. *
* *
* This port makes extensive use of the original net.sources *
* port by Jwahar Bammi. *
* *
* Ton van Overbeek *
* Email: TPC862@ESTEC.BITNET *
* TPC862%ESTEC.BITNET@WISCVM.WISC.EDU (ARPA) *
* ...!mcvax!tpc862%estec.bitnet (UUCP Europe) *
* ...!ucbvax!tpc862%estec.bitnet (UUCP U.S.A.) *
* 71450,3537 (CompuServe) *
* *
\***************************************************************/
/*
* Macro control for make
*/
#include "h.h"
struct macro *macrohead;
struct macro *
getmp(name)
char *name;
{
register struct macro *rp;
for (rp = macrohead; rp; rp = rp->m_next)
if (strcmp(name, rp->m_name) == 0)
return rp;
return (struct macro *)0;
}
char *
getmacro(name)
char *name;
{
struct macro *mp;
if (mp = getmp(name))
return mp->m_val;
else
return "";
}
struct macro *
setmacro(name, val)
char *name;
char *val;
{
register struct macro *rp;
register char *cp;
/* Replace macro definition if it exists */
for (rp = macrohead; rp; rp = rp->m_next)
if (strcmp(name, rp->m_name) == 0) {
free(rp->m_val); /* Free space from old */
break;
}
if (!rp) { /* If not defined, allocate space for new */
if ((rp = (struct macro *)malloc(sizeof (struct macro )))
== (struct macro *)0)
fatal("No memory for macro");
rp->m_next = macrohead;
macrohead = rp;
rp->m_flag = FALSE;
if ((cp = malloc(strlen(name) + 1)) == (char *)0)
fatal("No memory for macro");
strcpy(cp, name);
rp->m_name = cp;
}
if ((cp = malloc(strlen(val) + 1)) == (char *)0)
fatal("No memory for macro");
strcpy(cp, val); /* Copy in new value */
rp->m_val = cp;
return rp;
}
/*
* Do the dirty work for expand
*/
void
doexp(to, from, len, buf)
char ** to;
char * from;
int * len;
char * buf;
{
register char *rp;
register char *p;
register char *q;
register struct macro *mp;
rp = from;
p = *to;
while (*rp) {
if (*rp != '$') {
*p++ = *rp++;
(*len)--;
} else {
q = buf;
if (*++rp == '{')
while (*++rp && *rp != '}')
*q++ = *rp;
else if (*rp == '(')
while (*++rp && *rp != ')')
*q++ = *rp;
else if (!*rp) {
*p++ = '$';
break;
} else
*q++ = *rp;
*q = '\0';
if (*rp)
rp++;
if (!(mp = getmp(buf)))
mp = setmacro(buf, "");
if (mp->m_flag)
fatal("Infinitely recursive macro %s", mp->m_name);
mp->m_flag = TRUE;
*to = p;
doexp(to, mp->m_val, len, buf);
p = *to;
mp->m_flag = FALSE;
}
if (*len <= 0)
error("Expanded line too line");
}
*p = '\0';
*to = p;
}
/*
* Expand any macros in str.
*/
void
expand(str)
char *str;
{
static char a[LZ];
static char b[LZ];
char *p = str;
int len = LZ-1;
strcpy(a, str);
doexp(&p, a, &len, b);
}